package main

import (
	"fmt"
	"strings"
)

//TODO 闭包 返回一个函数，函数用到该函数外的变量
/**
闭包：简单讲，闭包是可以包含自由变量的代码块，即该变量不在当前代码块和全局环境中，而在定义代码块的环境中，如下的变量i在getNum()函数中，不属于返回值的函数也不属于全局函数。
闭包的代码块相当于提供了一个计算的安全的环境，之所以安全是因为仅能在内部匿名函数才能访问该变量，而无法在外部进行访问。
因此，闭包的代码块也可以作为参数传递给其他函数使用
*/
func getNum() func(add int) int {
	i := 1
	return func(add int) int {
		i += add
		return i
	}
}
func main() {
	num := getNum()
	//11
	fmt.Println(num(10))
	//31
	fmt.Println(num(20))

	hasSuffixFunc := makeSuffix(".jpg")
	fmt.Println(hasSuffixFunc("a.jpg"))
	fmt.Println(hasSuffixFunc("a"))
}
func makeSuffix(suffix string) func(fileName string) string {
	return func(fileName string) string {
		if strings.HasSuffix(fileName, suffix) {
			return fileName
		}
		return fileName + suffix
	}
}
